/**
 * 下载文件
 *
 * 此Js文件为通用方法下载文件方法
 * 将服务器返回的IO流下载成文件
 * @author ZhouWeiBo
 */
import Http from "./http";
import {errorMsg} from "@/util/global";
// 文件名后缀（文件类型）对应的ContentType类型 可自己补充扩展
const extMap = {
    '001': 'application/x-001',
    '907': 'drawing/907',
    'acp': 'audio/x-mei-aac',
    'asa': 'text/asa',
    'asp': 'text/asp',
    '323': 'text/h323',
    'acx': 'application/internet-property-stream',
    'ai': 'application/postscript',
    'awf': 'application/vnd.adobe.workflow',
    'aif': 'audio/x-aiff',
    'aifc': 'audio/x-aiff',
    'aiff': 'audio/x-aiff',
    'asf': 'video/x-ms-asf',
    'asr': 'video/x-ms-asf',
    'asx': 'video/x-ms-asf',
    'au': 'audio/basic',
    'avi': 'video/x-msvideo',
    'axs': 'application/olescript',
    'bas': 'text/plain',
    'bcpio': 'application/x-bcpio',
    'bin': 'application/octet-stream',
    'bmp': 'image/bmp',
    'c': 'text/plain',
    'cat': 'application/vnd.ms-pkiseccat',
    'cdf': 'application/x-cdf',
    'cer': 'application/x-x509-ca-cert',
    'class': 'application/octet-stream',
    'clp': 'application/x-msclip',
    'c4t': 'application/x-c4t',
    'cal': 'application/x-cals',
    'cel': 'application/x-cel',
    'cg4': 'application/x-g4',
    'cit': 'application/x-cit',
    'cml': 'text/xml',
    'cmx': 'image/x-cmx',
    'cod': 'image/cis-cod',
    'cpio': 'application/x-cpio',
    'crd': 'application/x-mscardfile',
    'crl': 'application/pkix-crl',
    'crt': 'application/x-x509-ca-cert',
    'css': 'text/css',
    'csi': 'application/x-csi',
    'cut': 'application/x-cut',
    'dbm': 'application/x-dbm',
    'dcd': 'text/xml',
    'dib': 'application/x-dib',
    'dcr': 'application/x-director',
    'der': 'application/x-x509-ca-cert',
    'dir': 'application/x-director',
    'drw': 'application/x-drw',
    'dwf': 'Model/vnd.dwf',
    'dwg': 'application/x-dwg',
    'dxf': 'application/x-dxf',
    'emf': 'application/x-emf',
    'dll': 'application/x-msdownload',
    'dms': 'application/octet-stream',
    'doc': 'application/msword',
    'dot': 'application/msword',
    'dvi': 'application/x-dvi',
    'dxr': 'application/x-director',
    'eps': 'application/postscript',
    'etx': 'text/x-setext',
    'evy': 'application/envoy',
    'exe': 'application/octet-stream',
    'fif': 'application/fractals',
    'flr': 'x-world/x-vrml',
    'gif': 'image/gif',
    'gtar': 'application/x-gtar',
    'gz': 'application/x-gzip',
    'h': 'text/plain',
    'hdf': 'application/x-hdf',
    'hlp': 'application/winhlp',
    'hqx': 'application/mac-binhex40',
    'hta': 'application/hta',
    'htc': 'text/x-component',
    'htm': 'text/html',
    'html': 'text/html',
    'htt': 'text/webviewhtml',
    'ico': 'image/x-icon',
    'ief': 'image/ief',
    'iii': 'application/x-iphone',
    'ins': 'application/x-internet-signup',
    'isp': 'application/x-internet-signup',
    'jfif': ':image/pipeg',
    'jpe': 'image/jpeg',
    'jpeg': ':image/jpeg',
    'jpg': 'image/jpeg',
    'js': 'application/x-javascript',
    'latex': 'application/x-latex',
    'lha': 'application/octet-stream',
    'lsf': 'video/x-la-asf',
    'lsx': 'video/x-la-asf',
    'lzh': 'application/octet-stream',
    'm13': 'application/x-msmediaview',
    'm14': 'application/x-msmediaview',
    'm3u': 'audio/x-mpegurl',
    'man': 'application/x-troff-man',
    'mdb': 'application/x-msaccess',
    'me': 'application/x-troff-me',
    'mht': 'message/rfc822',
    'mhtml': 'message/rfc822',
    'mid': 'audio/mid',
    'mny': 'application/x-msmoney',
    'mov': 'video/quicktime',
    'movie': 'video/x-sgi-movie',
    'mp2': 'video/mpeg',
    'mp3': 'audio/mpeg',
    'mp4': 'video/mpeg4',
    'mpa': 'video/mpeg',
    'mpe': 'video/mpeg',
    'mpeg': 'video/mpeg',
    'mpg': 'video/mpeg',
    'mpp': 'application/vnd.ms-project',
    'mpv2': 'video/mpeg',
    'ms': 'application/x-troff-ms',
    'mvb': 'application/x-msmediaview',
    'nws': 'message/rfc822',
    'oda': 'application/oda',
    'p10': 'application/pkcs10',
    'p12': 'application/x-pkcs12',
    'p7b': 'application/x-pkcs7-certificates',
    'p7c': 'application/x-pkcs7-mime',
    'p7m': 'application/x-pkcs7-mime',
    'p7r': 'application/x-pkcs7-certreqresp',
    'p7s': 'application/x-pkcs7-signature',
    'pbm': 'image/x-portable-bitmap',
    'pdf': 'application/pdf',
    'pfx': 'application/x-pkcs12',
    'pgm': 'image/x-portable-graymap',
    'pko': 'application/ynd.ms-pkipko',
    'pma': 'application/x-perfmon',
    'pmc': 'application/x-perfmon',
    'pml': 'application/x-perfmon',
    'pmr': 'application/x-perfmon',
    'pmw': 'application/x-perfmon',
    'pnm': 'image/x-portable-anymap',
    'pot': 'application/vnd.ms-powerpoint',
    'ppm': 'image/x-portable-pixmap',
    'pps': 'application/vnd.ms-powerpoint',
    'ppt': 'application/vnd.ms-powerpoint',
    'prf': 'application/pics-rules',
    'ps': 'application/postscript',
    'pub': 'application/x-mspublisher',
    'png': 'image/png',
    'qt': 'video/quicktime',
    'ra': 'audio/x-pn-realaudio',
    'ram': 'audio/x-pn-realaudio',
    'ras': 'image/x-cmu-raster',
    'rgb': 'image/x-rgb',
    'rmi': 'audio/mid',
    'roff': 'application/x-troff',
    'rtf': 'application/rtf',
    'rtx': 'text/richtext',
    'scd': 'application/x-msschedule',
    'sct': 'text/scriptlet',
    'setpay': 'application/set-payment-initiation',
    'setreg': 'application/set-registration-initiation',
    'sh': 'application/x-sh',
    'shar': 'application/x-shar',
    'sit': 'application/x-stuffit',
    'snd': 'audio/basic',
    'spc': 'application/x-pkcs7-certificates',
    'spl': 'application/futuresplash',
    'src': 'application/x-wais-source',
    'sst': 'application/vnd.ms-pkicertstore',
    'stl': 'application/vnd.ms-pkistl',
    'stm': 'text/html',
    'svg': 'image/svg+xml',
    'sv4cpio': 'application/x-sv4cpio',
    'sv4crc': 'application/x-sv4crc',
    'swf': 'application/x-shockwave-flash',
    't': 'application/x-troff',
    'tar': 'application/x-tar',
    'tcl': 'application/x-tcl',
    'tex': 'application/x-tex',
    'texi': 'application/x-texinfo',
    'texinfo': 'application/x-texinfo',
    'tgz': 'application/x-compressed',
    'tif': 'image/tiff',
    'tiff': 'image/tiff',
    'tr': 'application/x-troff',
    'trm': 'application/x-msterminal',
    'tsv': 'text/tab-separated-values',
    'txt': 'text/plain',
    'uls': 'text/iuls',
    'ustar': 'application/x-ustar',
    'vcf': 'text/x-vcard',
    'vrml': 'x-world/x-vrml',
    'wav': 'audio/x-wav',
    'wcm': 'application/vnd.ms-works',
    'wdb': 'application/vnd.ms-works',
    'wks': 'application/vnd.ms-works',
    'wmf': 'application/x-msmetafile',
    'wps': 'application/vnd.ms-works',
    'wri': 'application/x-mswrite',
    'wrl': 'x-world/x-vrml',
    'wrz': 'x-world/x-vrml',
    'xaf': 'x-world/x-vrml',
    'xbm': 'image/x-xbitmap',
    'xla': 'application/vnd.ms-excel',
    'xlc': 'application/vnd.ms-excel',
    'xlm': 'application/vnd.ms-excel',
    'xlsx': 'application/vnd.ms-excel',
    'xls': 'application/vnd.ms-excel',
    'xlt': 'application/vnd.ms-excel',
    'xlw': 'application/vnd.ms-excel',
    'xof': 'x-world/x-vrml',
    'xpm': 'image/x-xpixmap',
    'xwd': 'image/x-xwindowdump',
    'z': 'application/x-compress',
    'zip': 'application/zip',
    '*': 'application/octet-stream'
}

/* 封装一个通用的请求方法 */
const DownloadFile = (url, params) => {
    return Http({
        url,
        responseType: 'arraybuffer',
        method: 'get',
        params: {
            ...params
        }
    })
}

/* 处理下载请求，并将返回的IO流下载成文件 */
export const Download = (url, params) => {
    DownloadFile(url, params).then(response => {
        /* 获取文件描述信息，并且删除分号再转小写 */
        let disposition = response.headers['content-disposition'].replaceAll(";", "").toLowerCase();
        if (disposition === null || disposition === undefined) throw new Error("非法的服务器响应！");
        let fileExt = disposition.substring(disposition.lastIndexOf(".") + 1);
        let appType = extMap[fileExt] === undefined ? 'application/octet-stream' : extMap[fileExt];
        let blob = new Blob([response.data], {type: appType})
        let objectUrl = URL.createObjectURL(blob) // 创建URL
        location.href = objectUrl;
        URL.revokeObjectURL(objectUrl); // 释放内存
    }).catch(error => {
        console.log(error);
        errorMsg("下载失败");
    })
}
